﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Splitter_App
{
    public partial class _frm_Main : Form
    {
        private _cls_verbindung configModul;
        private List<_cls_verbindung> rechenModule = new List<_cls_verbindung>();

        public _frm_Main()
        {
            InitializeComponent();
        }

        private void _frm_Main_Load(object sender, EventArgs e)
        {
            // Versuche dei Verbindung zum Dienst herzustellen
            this.configModul = this.verbinden();

            if (this.configModul == null)
                this.Close();
        }

        private _cls_verbindung verbinden()
        {
            try
            {
                _cls_verbindung Modul = new _cls_verbindung();

                IVisual._SC.frm_Connect _frm_con = new IVisual._SC.frm_Connect(!Environment.GetCommandLineArgs().Contains("-NOAD"));
                if (_frm_con.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    Modul.IP = _frm_con.IP;
                    Modul.Port = _frm_con.Port;
                    Modul.CONNECT_CONFIG();
                }
                else
                    throw new Exception("Abbrechen geklickt");

                return Modul;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

            return null;
        }

        private void cmd_minus_Click(object sender, EventArgs e)
        {
            if (this.lv_instanten.SelectedItems.Count != 1)
                return;

            this.rechenModule.RemoveAt(int.Parse(this.lv_instanten.SelectedItems[0].Name));
            this.lv_instanten.SelectedItems[0].Remove();
        }

        private void cmd_plus_Click(object sender, EventArgs e)
        {
            _cls_verbindung verb = this.verbinden();

            if (verb != null)
            {
                this.rechenModule.Add(verb);

                ListViewItem lvi = new ListViewItem();
                lvi.Name = (this.rechenModule.Count - 1).ToString();
                lvi.SubItems[0].Text = verb.IP.ToString() + ":" + verb.Port;

                this.lv_instanten.Items.Add(lvi);
            }
        }

        private void cmd_start_Click(object sender, EventArgs e)
        {
            this.cmd_minus.Enabled = false;
            this.cmd_plus.Enabled = false;
            this.nud_ueberlappung.Enabled = false;
            this.cmd_start.Enabled = false;

            for (int i = 0; i < this.rechenModule.Count; i++)
            {
                if (this.rechenModule[i]._ctrl == null)
                    this.rechenModule[i].CONNECT_CONTROLLER();

                this.rechenModule[i]._ctrl.START_Learning();
            }

            MessageBox.Show("Lernen gestartet!");

            this.cmd_zusammenfuehren.Enabled = true;
            this.t_statsu_refr.Start();
        }

        private bool aktu_status()
        {
            bool alle_fertig = true;
            //prüfen ob alle fertig sind
            for (int i = 0; i < this.rechenModule.Count; i++)
            {
                if (this.rechenModule[i]._ctrl == null)
                    this.rechenModule[i].CONNECT_CONTROLLER();

                if (this.rechenModule[i]._ctrl.GET_STATE() != System.Threading.ThreadState.Stopped)
                {
                    this.lv_instanten.Items[i].BackColor = Color.Red;
                    alle_fertig = false;
                }
                else
                    this.lv_instanten.Items[i].BackColor = Color.Green;
            }

            return alle_fertig;
        }

        private void cmd_zusammenfuehren_Click(object sender, EventArgs e)
        {
            if(!this.aktu_status())
            {
                MessageBox.Show("Es sind noch nicht alle Lernvorgänge beendet!");
                return;
            }

            this.t_statsu_refr.Stop();

            //Summen Bilden
            Dictionary<string, double> durchschnittsGewichte = new Dictionary<string, double>();
            for (int i = 0; i < this.rechenModule.Count; i++)
            {
                List<Tuple<string, double>> gewichte = this.rechenModule[i]._ctrl.GET_WEIGHTS();

                foreach (Tuple<string, double> tpl in gewichte)
                {

                    if(!durchschnittsGewichte.ContainsKey(tpl.Item1))
                    {
                        durchschnittsGewichte.Add(tpl.Item1, tpl.Item2);
                    }
                    else
                    {
                        durchschnittsGewichte[tpl.Item1] += tpl.Item2;
                    }
                }
            }

            //Druchschnitt bilden und konvertieren
            List<Tuple<string, double>> neueGewichte = new List<Tuple<string, double>>();
            for(int i=0; i<durchschnittsGewichte.Count; i++)
            {
                string key = durchschnittsGewichte.Keys.ElementAt(i);
                durchschnittsGewichte[key] /= this.rechenModule.Count;

                neueGewichte.Add(new Tuple<string, double>(key, durchschnittsGewichte[key]));
            }

            if (this.configModul._ctrl == null)
                this.configModul.CONNECT_CONTROLLER();
            this.configModul._ctrl.SET_WEIGHTS(neueGewichte);

            MessageBox.Show("Der Config-Dienst enthält nun das generierte Netz!");
        }

        private void t_statsu_refr_Tick(object sender, EventArgs e)
        {
            this.aktu_status();
        }
    }
}
